// 导入koa，和koa 1.x不同，在koa2中，我们导入的是一个class，因此用大写的Koa表示:
const Koa = require('koa');
const path = require('path')
// 路由
const router = require('koa-router')();
// 请求体转换
// const bodyParser = require('koa-bodyparser');
// 静态资源
const static = require('koa-static')
// session
const session = require('koa-session-minimal')
const MysqlSession = require('koa-mysql-session')
//模板引擎
const views = require('koa-views')

//busboy 模块是用来解析POST请求，node原生req中的文件流。
// const Busboy = require('busboy')
const { uploadFile } = require('./upload/upload')
const mysql = require('mysql')

const { query } = require('./mysql/query')


const jsonp = require('koa-jsonp')

// 创建一个Koa对象表示web app本身:
const app = new Koa();
const publicPath = './public'
// app.use(bodyParser());
app.use(static(path.join(__dirname, publicPath)))
app.use(router.routes());

//数据库存储session
// 配置MySQL
let store = new MysqlSession({
  user: 'root',
  password: 'password',
  database: 'session',
  host: '127.0.0.1',
})

// 存放sessionId的cookie配置
let cookie = {
  maxAge: '', // cookie有效时长
  expires: '',  // cookie失效时间
  path: '', // 写cookie所在的路径
  domain: '', // 写cookie所在的域名
  httpOnly: '', // 是否只用于http请求中获取
  overwrite: '',  // 是否允许重写
  secure: '',
  sameSite: '',
  signed: '',

}


// 使用session中间件
app.use(session({
  key: 'SESSION_ID',
  store: store,
  cookie: cookie
}))


// 加载模板引擎
app.use(views(path.join(__dirname, './view'), {
  extension: 'ejs'
}))


// 使用中间件
app.use(jsonp())



// const pool = mysql.createPool({
//   host: '127.0.0.1',   // 数据库地址
//   user: 'root',    // 数据库用户
//   password: 'password',  // 数据库密码
//   database: 'koa'  // 选中数据库
// })

// // 执行sql脚本对数据库进行读写 
// pool.getConnection(function (err, connection) {

//   connection.query('SELECT * FROM user', (error, results, fields) => {

//     // 结束会话
//     connection.release();

//     // 如果有错误就抛出
//     if (error) throw error;
//   })
// })



// // req 为node原生请求
// const busboy = new Busboy({ headers: req.headers })
// // 监听文件解析事件
// busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
//   console.log(`File [${fieldname}]: filename: ${filename}`)


//   // 文件保存到特定路径
//   file.pipe(fs.createWriteStream('./public/upload'))

//   // 开始解析文件流
//   file.on('data', function (data) {
//     console.log(`File [${fieldname}] got ${data.length} bytes`)
//   })

//   // 解析文件结束
//   file.on('end', function () {
//     console.log(`File [${fieldname}] Finished`)
//   })
// })

// // 监听请求中的字段
// busboy.on('field', function (fieldname, val, fieldnameTruncated, valTruncated) {
//   console.log(`Field [${fieldname}]: value: ${inspect(val)}`)
// })

// // 监听结束事件
// busboy.on('finish', function () {
//   console.log('Done parsing form!')
//   res.writeHead(303, { Connection: 'close', Location: '/' })
//   res.end()
// })
// req.pipe(busboy)

// app.use(async (ctx, next) => {
//   console.log(`${ctx.request.method} ${ctx.request.url}`); // 打印URL
//   await next(); // 调用下一个middleware
// });

// app.use(async (ctx, next) => {
//   const start = new Date().getTime(); // 当前时间
//   await next(); // 调用下一个middleware
//   const ms = new Date().getTime() - start; // 耗费时间
//   console.log(`Time: ${ms}ms`); // 打印耗费时间
// });
// // 对于任何请求，app将调用该异步函数处理请求：
// app.use(async (ctx, next) => {
//   if (ctx.request.path === '/') {
//     ctx.response.body = 'index page'
//   } else {
//     await next()
//   }
// })
// app.use(async (ctx, next) => {
//   if (ctx.request.path === '/test') {
//     ctx.response.body = 'TEST page';
//   } else {
//     await next();
//   }
// });

// app.use(async (ctx, next) => {
//   if (ctx.request.path === '/error') {
//     ctx.response.body = 'ERROR page';
//   } else {
//     await next();
//   }
// });

// // 在端口3000监听:
// app.listen(3000);
// console.log('app started at port 3000...');
// log request URL:
// app.use(async (ctx, next) => {
//   console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);
//   await next();
// });

// // add url-route:
// router.get('/hello/:name', async (ctx, next) => {
//   var name = ctx.params.name;
//   ctx.response.body = `<h1>Hello, ${name}!</h1>`;
// });

// router.get('/', async (ctx, next) => {
//   ctx.response.body = `<h1>Index</h1>
//       <form action="/signin" method="post">
//           <p>Name: <input name="name" value="koa"></p>
//           <p>Password: <input name="password" type="password"></p>
//           <p><input type="submit" value="Submit"></p>
//       </form>`;
// });

// router.post('/signin', async (ctx, next) => {
//   var
//     name = ctx.request.body.name || '',
//     password = ctx.request.body.password || '';
//   console.log(`signin with name: ${name}, password: ${password}`);
//   if (name === 'koa' && password === '12345') {
//     ctx.response.body = `<h1>Welcome, ${name}!</h1>`;
//   } else {
//     ctx.response.body = `<h1>Login failed!</h1>
//       <p><a href="/">Try again</a></p>`;
//   }
// });

// add router middleware:


// router.get('/', (ctx, next) => {
//   let url = ctx.url
//   // 从上下文的request对象中获取
//   let request = ctx.request
//   // let req_query = request.query
//   // let req_querystring = request.querystring

//   // 从上下文中直接获取
//   // let ctx_query = ctx.query
//   // let ctx_querystring = ctx.querystring
//   let html = `
//   <h1>koa2 request post demo</h1>
//   <form method="POST" action="/">
//     <p>userName</p>
//     <input name="userName" /><br/>
//     <p>nickName</p>
//     <input name="nickName" /><br/>
//     <p>email</p>
//     <input name="email" /><br/>
//     <button type="submit">submit</button>
//   </form>
// `
//   ctx.body = html
// })


// router.post('/', (ctx, next) => {
//   ctx.body = ctx.request.body
// })
// router.get('/index', (ctx, next) => {
//   ctx.cookies.set(
//     'cid',
//     'hello world',
//     {
//       domain: 'localhost',  // 写cookie所在的域名
//       path: '/index',       // 写cookie所在的路径
//       maxAge: 10 * 60 * 1000, // cookie有效时长
//       expires: new Date('2023-03-03'),  // cookie失效时间
//       httpOnly: false,  // 是否只用于http请求中获取
//       overwrite: false  // 是否允许重写
//     }
//   )
//   ctx.body = 'cookie is ok'
// })

// router.get('/set', (ctx, next) => {
//   ctx.session = {
//     user_id: Math.random().toString(36).substr(2),
//     count: 0
//   }
//   ctx.body = ctx.session
// })

// app.use(async (ctx) => {
//   let title = 'hello koa2'
//   await ctx.render('index', {
//     title,
//   })
// })

// app.use(async (ctx) => {

//   if (ctx.url === '/' && ctx.method === 'GET') {
//     // 当GET请求时候返回表单页面
//     let html = `
//       <h1>koa2 upload demo</h1>
//       <form method="POST" action="/upload.json" enctype="multipart/form-data">
//         <p>file upload</p>
//         <span>picName:</span><input name="picName" type="text" /><br/>
//         <input name="file" type="file" /><br/><br/>
//         <button type="submit">submit</button>
//       </form>
//     `
//     ctx.body = html

//   } else if (ctx.url === '/upload.json' && ctx.method === 'POST') {
//     // 上传文件请求处理
//     let result = { success: false }
//     let serverFilePath = path.join(__dirname, './public/upload-files')

//     // 上传文件事件
//     result = await uploadFile(ctx, {
//       fileType: 'album', // common or album
//       path: serverFilePath
//     })

//     ctx.body = result
//   } else {
//     // 其他请求显示404
//     ctx.body = '<h1>404!!! o(╯□╰)o</h1>'
//   }
// })
async function selectAllData() {
  let sql = 'SELECT * FROM user'
  let dataList = await query(sql)
  return dataList
}

async function getData() {
  let dataList = await selectAllData()
  return dataList
}
router.get('/mysql', async (ctx, next) => {
  let res = await getData()
  ctx.body = res
})



router.get('/getData.jsonp', async (ctx, next) => {
  // 获取jsonp的callback
  let callbackName = ctx.query.callback || 'callback'
  let returnData = {
    success: true,
    data: {
      text: 'this is a jsonp api',
      time: new Date().getTime(),
    }
  }

  // jsonp的script字符串
  let jsonpStr = `;${callbackName}(${JSON.stringify(returnData)})`

  // 用text/javascript，让请求支持跨域获取
  ctx.type = 'text/javascript'

  // 输出jsonp字符串
  ctx.body = jsonpStr
})





app.listen(3000);
console.log('app started at port 3000...');